package com.my.valve;

import java.util.Date;

/**
 * Created by ZhongGang
 * at 2018/9/4 10:40
 * <p>
 * 阀门，限流器
 * <p>
 * 限流功能：
 * 1. 每隔多少时间限制多少访问次数，最小单位为秒
 * 2. 在某个时间段限制多少访问次数，最小单位为秒
 * <p>
 * 实现方式：
 * 1. sleep
 * 2. lock
 * <p>
 * 扩展功能：
 * 1. 分布式限流
 */
public class Valve {
    private int capacity;//阀门允许通过的最大流量

    public Valve(int capacity) {
        if (capacity <= 0) {
            throw new IllegalArgumentException();
        }

        this.capacity = capacity;
    }

    public void acquire() {
        this.acquire(1);
    }

    /**
     * 1. 如果acquire时间在阀门开启与关闭时间之内（注：左闭右开），
     * 用最大访问量减去acquires值， 结果大于等于0则通过，
     * 否则等待特定时间（下一个阀门的开启时间 - acquire时间），继续acquire执行
     * <p>
     * 2. 如果acquire时间大于阀门关闭时间，则开启下一个阀门，进行操作1的步骤
     *
     * @param acquires
     */
    public void acquire(int acquires) {
        Date now = new Date();
        Period period = period();
        throw new UnsupportedOperationException();
    }

    protected Period period() {
        throw new UnsupportedOperationException();
    }

    static class Period {
        private Date startTime;//有效期开始时间
        private Date endTime;//有效期结束时间
        private int times;//有效期内实际流量

    }

}
